/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio.servicios;

import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio.*;

/**
 *
 * @author Administrador
 */
public class UtilGeometria {
    
    public static boolean hayColision(Circulo circulo1, Circulo circulo2)
    {
        Punto p1 = circulo1.getCentro();
        Punto p2 = circulo2.getCentro();
        final double a = circulo1.radio + circulo2.radio;
        final double dx = p1.x - p2.x;
        final double dy = p1.y - p2.y;
        return a * a > (dx * dx + dy * dy);
    }

    
    public static Posicion[] getInterseccionCirculosAprox(Circulo circulo1, Circulo circulo2) {
        Punto c1 = circulo1.getCentro();
        Punto c2 = circulo2.getCentro();

        double r1 = circulo1.radio;
        double r2 = circulo2.radio;
        
        Posicion p1 = r1>=r2? new Posicion(c1.x,c1.y) : new Posicion(c2.x,c2.y);
        Posicion p2 = r1>=r2? new Posicion(c2.x,c2.y) : new Posicion(c1.x,c1.y);
        
        double distancia = p1.distancia(p2);
        if (distancia > r1 + r2) return null;
        double angulo = p1.angulo(p2);
        double distanciaCentroInterseccion = (r1 + r2 - distancia)/2 + r2;
        Posicion tangente1  = p2.moverAngulo(angulo - Math.PI/2, r2);
        Posicion tangente2  = p2.moverAngulo(angulo + Math.PI/2, r2);
        
        Posicion interseccion1 = tangente1.moverAngulo(angulo - Math.PI, distanciaCentroInterseccion);
        Posicion interseccion2 = tangente2.moverAngulo(angulo + Math.PI, distanciaCentroInterseccion);
        Posicion[] intersecciones = new Posicion[2];
        intersecciones[0] = interseccion1;
        intersecciones[1] = interseccion2;
        
        
/*
        
        Posicion interseccion3 = tangente1.moverAngulo(angulo , distanciaCentroInterseccion);
        Posicion interseccion4 = tangente2.moverAngulo(angulo , distanciaCentroInterseccion);
        
        intersecciones[2] = interseccion3;
        intersecciones[3] = interseccion4;
        //System.out.println("UTIL GEOM");
        //System.out.println("CIRCULO 1: "+circulo1 +"///CIRCULO 2: "+  circulo2);
        //System.out.println("INT 1: "+interseccion1 + ",INT 2:"+interseccion2);
*/
     //   Posicion [] sinAprox = getInterseccionCirculos(circulo1, circulo2);
      //  System.out.println(sinAprox[0] +" === " + sinAprox[1]+ "\n");

  //      System.out.println(tangente1+" === "+tangente2 + "---" + distancia+" === "+distanciaCentroInterseccion + "=>"+Math.cos(Math.PI/2));
        //return sinAprox;
        
        return intersecciones;
    }
    
    
    public static Posicion[] getInterseccionCirculos(Circulo circulo1, Circulo circulo2) {
        Posicion[] puntosInterseccion = new Posicion[2];
        
        
        double r1 = circulo1.radio;
        double r2 = circulo2.radio;
        Punto p1 = circulo1.getCentro();
        Punto p2 = circulo2.getCentro();
        if (new Posicion(p1.x,p1.y).distancia(new Posicion(p2.x,p2.y))> 
                r1 + r2) return null;
        double x1 = p1.x;
        double x2 = p2.x;
        double y1 = p1.y;
        double y2 = p2.y;
        
        double xx1 = x1*x1;
        double xx2 = x2*x2;
        double yy1 = y1*y1;
        double yy2 = y2*y2;
        double rr1 = r1*r1;
        double rr2 = r2*r2;
        
        double dx = x2-x1;
        double dy = y2-y1;

        double dx2 = xx2-xx1;
        double dy2 = yy2-yy1;
        double dr2 = rr2-rr1;
        
        if (dy==0) return null;
        double a1 = (dr2-dx2-dy2)/(-2*dy);
        double a2 = dx/dy;
        
        double a = (1+a2);
        double b = 2*(-x1-a1*a2+y1*a2);
        double c = (xx1)-(rr1)+Math.sqrt(y1-a1);
        
        double raiz = (b*b)-(4*a*c);
        double aa = 2*a;
        if (raiz<0 || aa==0) return null;
        raiz = Math.sqrt(raiz);
        double solx1 = (-b+raiz)/aa;
        double solx2 = (-b-raiz)/aa;
        double soly1 = a1 - a2* solx1;
        double soly2 = a1 - a2* solx2;
        Posicion solp1 = new Posicion(solx1, soly1);
        Posicion solp2 = new Posicion(solx2, soly2);
     //   System.out.println(circulo1.toString() +"///"+ circulo2.toString() +"///"+  solp1 +"///"+ solp2);
        puntosInterseccion[0] = solp1;
        puntosInterseccion[1] = solp2;
        return puntosInterseccion;
    }
    
    public static double redondeaDouble(double d) {
    	return ((double)Math.round(d*100))/100;
    }
}
